package demo

import (
	"context"
	"fmt"
	"local/service_manager"
	"net/http"
	"os"
	"vidii"
	"youdu"

	youduModel "youdu/model"

	"github.com/gin-gonic/gin"
)

// DemoService 定义示例服务结构
type DemoService struct {
	name        string
	description string
	server      *http.Server
	lastError   *service_manager.ServiceError
}

// NewDemoService 创建新的示例服务
func NewService() *DemoService {
	return &DemoService{
		name:        "sync_service",
		description: "有度插件 - 组织架构同步",
	}
}

// GetName 获取服务名称
func (s *DemoService) GetName() string {
	return s.name
}

// GetDescription 获取服务描述
func (s *DemoService) GetDescription() string {
	return s.description
}

// GetDependencies 获取服务依赖
func (s *DemoService) GetDependencies() []string {
	// Demo服务没有依赖
	return nil
}

// GetLastError 获取最后一次错误
func (s *DemoService) GetLastError() *service_manager.ServiceError {
	return s.lastError
}

// OnStart 服务启动前的初始化
func (s *DemoService) OnStart(ctx context.Context) error {
	youduOrg := youdu.Org{
		Server:        "http://121.229.102.17:7080",
		Buin:          16126317,
		AppId:         "sysOrgAssistant",
		EncodedAesKey: "kzjvwq9siGW17Hiw4nNxneLlOpCBKuPg6rPyfEPHZv4=",
	}
	youduApp := youdu.Appmsg{
		Server:        "http://121.229.102.17:7080",
		Buin:          16126317,
		AppId:         "yd5EBD3798C847468690FBAB7B60DD4100",
		EncodedAesKey: "YNgIT1ETntJAE877Rrujm3Bre9HW1IhJtoeJIZWVYjE=",
	}
	youduAppMail := youdu.Appmsg{
		Server:        "http://121.229.102.17:7080",
		Buin:          16126317,
		AppId:         "sysExmailAssistant",
		EncodedAesKey: "U7RpMNo9dtLB8QsmwooQRjf8znXIwNdULQqelLfHB54=",
	}

	err := youduOrg.UserCreate(youduModel.UserInfo{
		UserId: "vi3",
		Name:   "测试账号",
		Dept:   []int{0},
	})

	// 列出用户
	list, err := youduOrg.UserInfoGet("vi3")
	fmt.Println("新用户", vidii.Tools.JsonEncode(list))

	fmt.Println("创建用户", err)

	// 退出整个进程
	os.Exit(0)

	// _, err := youduOrg.DepartmentCreate(youduModel.DepartmentInfo{
	// 	Name:     "测试部门5566",
	// 	ParentId: 0,
	// })
	// fmt.Println("创建部门", err)
	// err := youduOrg.DepartmentDelete(17)
	// fmt.Println("删除部门", err)
	// //
	// lll, err := youduOrg.DepartmentListGet(0)
	// fmt.Println("获取部门列表", lll, err)

	// ttt := youduModel.DepartmentInfo{
	// 	Name:     "测试部门5566",
	// 	ParentId: 0,
	// 	SortId:   0,
	// }
	// // 序列化为JSON字符串
	// jjj, _ := json.Marshal(ttt)
	// log.Println("创建部门", string(jjj))
	// 初始化路由
	r := gin.Default()
	api := r.Group("/api")
	{

		// 增加一个列出部门的接口
		api.GET("/dept/list", func(c *gin.Context) {
			// 获取部门列表
			deptList, err := youduOrg.DepartmentListGet(0)
			if err != nil {
				c.JSON(500, gin.H{
					"error": err.Error(),
				})
				return
			}
			// 返回部门列表
			c.JSON(200, gin.H{
				"code": 0,
				"msg":  "ok",
				"data": deptList,
			})

		})

		api.GET("/status", func(c *gin.Context) {
			c.JSON(200, gin.H{
				"status":  "running",
				"service": s.name,
			})
		})

		api.GET("/hello", func(c *gin.Context) {
			err := youduApp.SendTextMsg(
				"vi",       // 接收消息的用户账号，多个用|分隔
				"",         // 接收消息的部门，多个用|分隔
				"这是一条测试消息", // 消息内容
			)
			if err != nil {
				c.JSON(500, gin.H{
					"error": err.Error(),
				})
				return
			}
			c.JSON(200, gin.H{
				"message": "Hello from Demo Service!",
			})
		})

		api.POST("/mail/:type", func(c *gin.Context) {
			var params youduModel.MailMessage
			if err := c.ShouldBindJSON(&params); err != nil {
				c.JSON(400, gin.H{
					"error": "无效参数",
				})
				return
			}
			params.MsgType = "mail"
			params.Mail.Action = c.Param("type")
			if params.Mail.Action == "new" {
				params.Mail.Link = "https://mail.139.com"
			}

			err := youduAppMail.SendMailMsg(
				params,
				// youduModel.MailMessage{
				// 	ToUser:  "vi",
				// 	MsgType: "mail",
				// 	Mail: youduModel.MailMessageMail{
				// 		Action:   "new",
				// 		Subject:  "关于合作开发有度邮箱集成的合同",
				// 		FromUser: "lan",
				// 		// FromEmail: "215879458@qq.com",
				// 		// Time:        time.Now().Format("2006-01-02 15:04:05"),
				// 		// Link:        "",
				// 		// UnreadCount: 6,
				// 	},
				// },
			)
			if err != nil {
				c.JSON(500, gin.H{
					"error": err.Error(),
				})
				return
			}
			c.JSON(200, gin.H{
				"message": "推送邮件提醒成功",
			})
			// 判断接收账户是否“vi”，如果就退出
			if params.ToUser == "vi" {
				return
			}
			// 复制一份消息发给 vi 账号
			content := params.Mail.Subject
			content2 := fmt.Sprintf("【%s】测试\n%s", params.ToUser, content)
			youduApp.SendTextMsg(
				"vi",     // 接收消息的用户账号，多个用|分隔
				"",       // 接收消息的部门，多个用|分隔
				content2, // 消息内容
			)
		})

		// 增加一个接口 newmail，从前端post3个参数：接收账户，接收部门，消息内容
		api.POST("/newmsg", func(c *gin.Context) {
			// var params struct {
			// 	ToUser  string `json:"to_user"`
			// 	ToDept  string `json:"to_dept"`
			// 	Content string `json:"content"`
			// }
			// if err := c.ShouldBindJSON(&params); err != nil {
			// 	c.JSON(400, gin.H{
			// 		"error": "Invalid request",
			// 	})
			// 	return
			// }

			// 获取参数
			toUser := c.PostForm("to_user")
			toDept := c.PostForm("to_dept")
			content := c.PostForm("content")
			if toUser == "" || content == "" {
				c.JSON(400, gin.H{
					"error": "Missing required parameters",
				})
				return
			}
			params := struct {
				ToUser  string `json:"to_user"`
				ToDept  string `json:"to_dept"`
				Content string `json:"content"`
			}{
				ToUser:  toUser,
				ToDept:  toDept,
				Content: content,
			}
			// 发送消息

			err := youduApp.SendTextMsg(
				params.ToUser,  // 接收消息的用户账号，多个用|分隔
				params.ToDept,  // 接收消息的部门，多个用|分隔
				params.Content, // 消息内容
			)
			if err != nil {
				c.JSON(500, gin.H{
					"error": err.Error(),
				})
				return
			}
			c.JSON(200, gin.H{
				"message": "推送消息成功",
			})
			// 判断接收账户是否“vi”，如果就退出
			if params.ToUser == "vi" {
				return
			}
			// 复制一份消息发给 vi 账号
			content2 := fmt.Sprintf("【%s】测试\n%s", params.ToUser, content)
			youduApp.SendTextMsg(
				"vi",     // 接收消息的用户账号，多个用|分隔
				"",       // 接收消息的部门，多个用|分隔
				content2, // 消息内容
			)
		})

	}

	s.server = &http.Server{
		Addr:    fmt.Sprintf(":%d", 8012),
		Handler: r,
	}

	return nil
}

// Entry 服务入口函数
func (s *DemoService) Entry(ctx context.Context) error {
	// 在goroutine中启动HTTP服务器
	errChan := make(chan error, 1)
	go func() {
		if err := s.server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			errChan <- fmt.Errorf("HTTP服务器错误: %v", err)
		}
		close(errChan)
	}()

	// 等待上下文取消或服务器错误
	select {
	case <-ctx.Done():
		return nil
	case err := <-errChan:
		if err != nil {
			s.lastError = &service_manager.ServiceError{
				Message: "服务运行失败",
				Details: err.Error(),
			}
			return err
		}
		return nil
	}
}

// OnStop 服务停止前的清理
func (s *DemoService) OnStop(ctx context.Context) error {
	if s.server != nil {
		// 优雅关闭HTTP服务器
		if err := s.server.Shutdown(ctx); err != nil {
			return fmt.Errorf("关闭HTTP服务器失败: %v", err)
		}
	}
	return nil
}
